#include "pch.hpp"
#include "Layout.hpp"
#include "Widget.hpp"

using namespace Engine;
using namespace Engine::Ui;




Layout::Layout(Widget::weak_ptr attached)
	: m_attached(attached)

	, m_moving(false)
	, m_resizing(false)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Layout::post_create(ptr _this)
{
	m_this = _this;

	auto attached = Widget::ptr(m_attached);

	// We want to be notified when the attached widget is being resized
	attached->resized.connect(Widget::notify::slot_type(&Layout::onAttachedResized, this)
		.track(m_this));
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Layout::~Layout()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




Widget::ptr Layout::attached() const
{
	return Widget::ptr(m_attached);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Widget::ptr Layout::add(Widget::ptr widget)
{
	attached()->add(widget);

	m_widgets.push_back(widget);

	widget->resized.connect(Widget::notify::slot_type(&Layout::onChildResized, this)
		.track(m_this)
		.track(widget)
	);

	widget->moved.connect(Widget::notify::slot_type(&Layout::onChildMoved, this)
		.track(m_this)
		.track(widget)
	);

	repositionChildren();

	return widget;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

/*
void Layout::remove(Widget::ptr widget)
{
	for(auto i = m_widgets.begin(); i != m_widgets.end(); ++i)
	{
		if(*i == widget)
		{
			attached()->remove(widget);

			m_widgets.erase(i);

			widget->resized.disconnect(Widget::notify::slot_type(&Layout::onChildResized, this));
			widget->moved.disconnect(Widget::notify::slot_type(&Layout::onChildMoved, this));

			repositionChildren();
			break;
		}
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
*/

const Layout::Widgets& Layout::widgets() const
{
	return m_widgets;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool Layout::hasWidget(Resizing::Type resizing) const
{
	return numWidgets(resizing) != 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

uint32 Layout::numWidgets(Resizing::Type resizing) const
{
	uint32 num = 0;

	foreach(const Widget::ptr& widget, m_widgets)
	{
		if(widget->resizing() == resizing)
			++num;
	}

	return num;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void Layout::onAttachedResized()
{
	repositionChildren();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Layout::onChildResized()
{
	repositionChildren();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Layout::onChildMoved()
{
	repositionChildren();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
